package array.prefixsum;

import java.util.HashMap;

public class CheckSubArraySum {

    public boolean checkSubarraySum(int[] nums, int k) {
        int n = nums.length;
        // 计算nums的前缀和
        int[] preSum = new int[n + 1];
        preSum[0] = 0;
        for (int i = 1; i <= n; i++) {
            preSum[i] = preSum[i - 1] + nums[i - 1];
        }
        // 前缀和与k的余数到索引的映射，方便快速查找所需的前缀和
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < preSum.length; i++) {
            // 如果这个前缀和还没有对应的索引，则记录下来
            int val = preSum[i] % k;
            if (!map.containsKey(val)) {
                map.put(val, i);
            }
            // 若已存在，则跳过
        }
        int res = 0;
        for (int i = 0; i < preSum.length; i++) {
            // 计算need，使得（preSum[i] - need）% k == 0
            int need = preSum[i] % k;
            if (map.containsKey(need)) {
                if (i - map.get(need) >= 2) {
                    return true;
                }
            }
        }
        return false;
    }
}
